#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>        // 包含 struct inode 和 struct file 定义
#include <linux/cdev.h>      // 字符设备相关
#include <linux/uaccess.h>   // 包含 copy_from_user 声明
#include <linux/device.h>   // 包含 class_create 和 device_create 的声明
#include <asm/io.h>


/*********导出设备属性文件************/
unsigned long id = 0;
ssize_t xdev_id_show(struct device *dev, struct device_attribute *attr,
                char *buf)
{
    return sprintf(buf, "%d\n", (int)id);
}

ssize_t xdev_id_store(struct device *dev, struct device_attribute *attr,
                const char *buf, size_t count)
{
    kstrtoul(buf, 10, &id);//将一个字符串转换成一个无符号长整型的数据
    return count;
}
DEVICE_ATTR(xdev_id, S_IRUSR|S_IWUSR, xdev_id_show, xdev_id_store);
/**********************/

extern struct bus_type xbus;

void xdev_release(struct device *dev)
{
    printk("%s-%s\n", __FILE__, __func__);
}


static struct device xdev = {
    .init_name = "xdev",
    .bus = &xbus,
    .release = xdev_release,
};

	

static __init int xdev_init(void)
{
    printk("xdev init\n");
    device_register(&xdev);
    device_create_file(&xdev, &dev_attr_xdev_id);
    return 0;
}
module_init(xdev_init);


static __exit void xdev_exit(void)
{
    printk("xdev exit\n");
    device_remove_file(&xdev, &dev_attr_xdev_id);
    device_unregister(&xdev);
}
module_exit(xdev_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("embedfire ");
MODULE_DESCRIPTION("hello module");
MODULE_ALIAS("test_module");

